#元组
# 元组常用方法及函数：
# --------------------------------
# count(x)        : 返回元素 x 在元组中出现的次数 (返回类型: int)
# index(x)        : 返回元素 x 第一次出现的索引 (返回类型: int)
# len(tuple)      : 返回元组的元素个数 (返回类型: int)
# max(tuple)      : 返回元组中最大的元素 (返回类型: 与元素类型一致)
# min(tuple)      : 返回元组中最小的元素 (返回类型: 与元素类型一致)
# sorted(tuple)   : 对元组元素进行排序，返回一个新列表 (返回类型: list)
# tuple(iterable) : 将可迭代对象（如列表）转换为元组 (返回类型: tuple)
# --------------------------------
# 注意：元组是不可变对象，因此没有修改自身的方法


#一、元组的创建
# 1. 直接创建：使用圆括号，元素间用逗号分隔
tup01 = (1, 2, 3)  # 创建包含整数1、2、3的元组

# 2. 创建单元素元组：必须在元素后加逗号，否则会被识别为普通变量
tup02 = (1,)  # 正确创建一个只包含整数1的元组。不加逗号则变成整数1而非元组

# 3. 创建空元组：有两种等效方式
tup03 = ()         # 使用空圆括号
tup04 = tuple()    # 使用tuple()构造函数

# 4. 转换创建：通过tuple()函数将其他可迭代对象（如列表）转换为元组
tup05 = tuple([1, 2, 3])  # 将列表[1, 2, 3]转换为元组(1, 2, 3)


#二、访问与查询
# 索引访问
tup = ('a', 'b', 'c', 'd')
print(tup[0])    # 输出: 'a'
print(tup[-1])   # 输出: 'd' (最后一个元素)

# 切片操作
print(tup[1:3])    # 输出: ('b', 'c')
print(tup[::2])    # 输出: ('a', 'c') (步长为2)
print(tup[::-1])   # 输出: ('d', 'c', 'b', 'a') (反转元组)

# 查询元素是否存在
print('b' in tup)  # 输出: True

# 查找元素索引
print(tup.index('c'))  # 输出: 2 (返回第一个匹配项的索引)


#三、统计与计算
# 统计元素出现次数
tup = (1, 2, 2, 3, 2, 4)
print(tup.count(2))  # 输出: 3

# 使用max()和min()函数
print(max(tup))  # 输出: 4
print(min(tup))  # 输出: 1

# 使用sum()函数（元组元素需为数值）
num_tup = (1, 2, 3, 4, 5)
print(sum(num_tup))  # 输出: 15

# 使用len()函数
print(len(tup))  # 输出: 6


# 四、元组解包
# 基本解包
tup = (1, 2, 3)
a, b, c = tup
print(a, b, c)  # 输出: 1 2 3

# 星号解包（Python 3.5+）
first, *middle, last = (1, 2, 3, 4, 5)
print(first)    # 输出: 1
print(middle)   # 输出: [2, 3, 4] (注意是列表)
print(last)     # 输出: 5

# 交换变量值
x, y = 10, 20
x, y = y, x  # 交换x和y的值
print(x, y)  # 输出: 20 10


#五、元组与函数
# 函数返回多个值（实际上返回一个元组）
def min_max(numbers):
    return min(numbers), max(numbers)

result = min_max([1, 2, 3, 4, 5])  # 返回(1, 5)
min_val, max_val = result  # 解包元组
print(f"最小值: {min_val}, 最大值: {max_val}")

# 使用*args接收可变数量参数（类型为元组）
def sum_all(*args):
    print(f"参数类型: {type(args)}")  # <class 'tuple'>
    return sum(args)

print(sum_all(1, 2, 3, 4, 5))  # 输出: 15


#六、排序与转换
# 使用sorted()对元组元素排序（返回列表）
tup = (3, 1, 4, 2, 5)
sorted_list = sorted(tup)  # 返回[1, 2, 3, 4, 5]
sorted_tuple = tuple(sorted(tup))  # 转换为元组: (1, 2, 3, 4, 5)

# 元组与列表的相互转换
my_list = [1, 2, 3]
my_tuple = tuple(my_list)  # (1, 2, 3)
new_list = list(my_tuple)  # [1, 2, 3]

# 元组与字符串的转换
char_tuple = tuple("hello")  # ('h', 'e', 'l', 'l', 'o')
str_from_tuple = ''.join(('h', 'e', 'l', 'l', 'o'))  # "hello"


#实例和应用
# 示例1: 数据库查询结果（通常以元组形式返回）
database_results = [
    (101, "Alice", "Engineering"),
    (102, "Bob", "Marketing"),
    (103, "Charlie", "Sales")
]

# 提取所有ID和姓名
ids = tuple(record[0] for record in database_results)  # (101, 102, 103)
names = tuple(record[1] for record in database_results)  # ('Alice', 'Bob', 'Charlie')

# 示例2: 坐标处理
points = [(1, 2), (3, 4), (5, 6)]
for x, y in points:
    print(f"X: {x}, Y: {y}")

# 示例3: 配置信息（利用元组不可变性保护数据）
APP_CONFIG = (
    ("timeout", 30),
    ("max_connections", 100),
    ("debug_mode", False)
)


